package cn.edu.cdu.health.controller;
import cn.edu.cdu.health.common.BizException;
import cn.edu.cdu.health.common.R;
import cn.edu.cdu.health.entity.PageDto;
import cn.edu.cdu.health.entity.PageResult;
import cn.edu.cdu.health.entity.User;
import cn.edu.cdu.health.service.UserService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;
    // POST方式登录 - 从数据库验证
    // POST方式登录 - 支持“手机号或邮箱”登录
    @PostMapping("/login")
    public R loginPost(@RequestBody User loginUser) {
        String loginAccount = loginUser.getPhone();
        String password = loginUser.getPassword();

        // 1. 按手机号/邮箱查询用户（之前实现的逻辑）
        User user = userService.findByPhoneOrEmail(loginAccount);

        if (user == null) {
            return R.failed("手机号/邮箱或密码错误");
        } else if (user.getStatus() == 0) {
            return R.failed("账号已禁用，请联系管理员");
        } else if (!user.getPassword().equals(password)) { // 实际项目需加密校验
            return R.failed("手机号/邮箱或密码错误");
        }

        // 2. 登录成功：返回用户信息（包含role角色）
        Map<String, Object> userInfo = new HashMap<>();
        userInfo.put("userId", user.getId());
        userInfo.put("name", user.getName());
        userInfo.put("role", user.getRole()); // 关键：返回角色信息
        userInfo.put("token", UUID.randomUUID().toString()); // 可选：生成Token标记登录状态

        return R.ok(userInfo);
    }

    @PostMapping("/selectByPage")
    public R selectByPage(@RequestBody PageDto pageDto){
        // 创建分页对象
        IPage<User> page = new Page<>(pageDto.getCurrent(), pageDto.getPage());

        // 构建查询条件
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();

        // 关键词搜索（用户名、手机号、邮箱）
        if (StringUtils.hasText(pageDto.getKeyword())) {
            queryWrapper.and(wrapper -> wrapper
                    .like("user_name", pageDto.getKeyword())
                    .or()
                    .like("user_phone", pageDto.getKeyword())
                    .or()
                    .like("user_email", pageDto.getKeyword())
            );
        }

        // 角色筛选
        if (StringUtils.hasText(pageDto.getRole())) {
            queryWrapper.eq("user_role", pageDto.getRole());
        }

        // 状态筛选
        if (pageDto.getStatus() != null) {
            queryWrapper.eq("user_status", pageDto.getStatus());
        }

        // 按创建时间倒序排列
        queryWrapper.orderByDesc("created");

        // 执行分页查询
        userService.page(page, queryWrapper);

        // 转换结果
        List<User> records = page.getRecords();
        long total = page.getTotal();

        PageResult<User> pageResult = new PageResult<>();
        pageResult.setRecords(records);
        pageResult.setTotal(total);
        pageResult.setCurrent(pageDto.getCurrent());
        pageResult.setSize(pageDto.getPage());
        pageResult.setPages((long) Math.ceil((double) total / pageDto.getPage()));

        return R.ok(pageResult);
    }

    @PutMapping("/{id}")
    public R updateUser(@PathVariable Integer id, @RequestBody User user) {
        // 1. 校验ID一致性（避免前端传递的ID与路径ID冲突）
        if (!id.equals(user.getId())) {
            return R.failed("参数错误，ID不匹配");
        }

        // 2. 调用Service层执行更新
        boolean success = userService.updateUserInfo(user);

        // 3. 返回结果
        if (success) {
            return R.ok("用户信息更新成功");
        } else {
            return R.failed("更新失败，用户不存在或数据未变更");
        }
    }

    /**
     * 获取用户详情
     */
    @GetMapping("/{id}")
    public R getUserById(@PathVariable Integer id) {
        try {
            User user = userService.getById(id);
            if (user != null) {
                return R.ok(user);
            } else {
                return R.failed("用户不存在");
            }
        } catch (BizException e) {
            return R.failed(e.getMessage());
        }
    }

    /**
     * 删除用户
     */
    @DeleteMapping("/{id}")
    public R deleteUser(@PathVariable Integer id) {
        boolean success = userService.removeById(id);
        if (success) {
            return R.ok("删除成功");
        } else {
            return R.failed("删除失败");
        }
    }

    // 新增注册接口
    @PostMapping("/register")
    public R register(@RequestBody User registerUser) {
        try {
            // 1. 检查用户名是否已存在
            User existingUser = userService.findByUserName(registerUser.getName());
            if (existingUser != null) {
                return R.failed("该用户名已被使用");
            }

            // 2. 检查手机号是否已存在（可选）
            User existingPhone = userService.findByPhone(registerUser.getPhone());
            if (existingPhone != null) {
                return R.failed("该手机号已被注册");
            }

            // 3. 设置默认值
            registerUser.setStatus(1); // 1表示正常状态
            registerUser.setCreated(LocalDateTime.now());
            registerUser.setUpdated(LocalDateTime.now());

            // 4. 保存用户
            boolean success = userService.save(registerUser);
            if (success) {
                return R.ok(registerUser);
            } else {
                return R.failed("注册失败，请稍后重试");
            }
        } catch (Exception e) {
            e.printStackTrace();
            return R.failed("系统错误，注册失败");
        }
    }
}